<?php
declare (strict_types=1);

namespace app\validate;

use think\facade\Db;
use think\Validate;

class Active extends Validate
{
    /**
     * 定义验证规则
     * 格式：'字段名' =>  ['规则1','规则2'...]
     *
     * @var array
     */
    protected $rule = [
        'name' => ['require', 'checkUnique:thinkphp'],
        'apply_start' => ['require', 'dateFormat:Y-m-d H:i:s'],
        'apply_end' => ['require', 'dateFormat:Y-m-d H:i:s', 'checkApplyTime:thinkphp'],
        'start_time' => ['require', 'dateFormat:Y-m-d H:i:s'],
        'end_time' => ['require', 'dateFormat:Y-m-d H:i:s', 'checkStartTime:thinkphp'],
        'type' => ['require'],
        'examiner'=>['require'],
        'code'=>['require']
    ];
    /**配置使用场景
     * @var array
     */
    protected $scene = [
        'insert' => ['name', 'apply_start', 'apply_end', 'start_time', 'end_time','type','examiner','code'],
        'config' => ['period', 'place_num', 'unlock', 'timePeriod_1', 'timePeriod_2', 'timePeriod_3', 'active_id','examiner','code']
    ];
    /**
     * 定义错误信息
     * 格式：'字段名.规则名' =>  '错误信息'
     *
     * @var array
     */
    protected $message = [
        'name.require' => '活动名称不能为空',
        'name.checkUnique' => '活动名称重复',
        'apply_start.require' => '报名开始时间不能为空',
        'apply_start.dateFormat' => '报名开始时间格式错误',
        'apply_end.require' => '报名结束时间不能为空',
        'apply_end.dateFormat' => '报名结束时间格式错误',
        'apply_end.checkApplyTime' => '报名开始时间和结束时间范围不正确',
        'start_time.require' => '活动开始时间不能为空',
        'start_time.dateFormat' => '活动开始时间格式错误',
        'end_time.require' => '活动结束时间不能为空',
        'end_time.dateFormat' => '活动结束时间格式错误',
        'end_time.checkStartTime' => '活动开始时间和结束时间范围不正确',
        'type'=>'考试类型不能为空',
        'examiner.require'=>'至少选择一个执考考官',
        'code.require'=>'考场编码不能为空'
    ];

    /**
     * 校验活动名称是否重复
     * @param $value
     * @param $rule
     * @param array $data
     * @return bool
     */
    protected function checkUnique($value, $rule, array $data = []): bool
    {
        $condition = array(
            ['name', '=', $value]
        );
        if (isset($data['id']) && !empty($data['id'])) {
            $condition[] = ['id', '<>', $data['id']];
        }
        $check = Db::name('active')->where($condition)->count();
        if ($check > 0) {
            return false;
        } else {
            return true;
        }
    }

    /**
     * 校验报名时间范围是否合理
     * @param $value
     * @param $rule
     * @param array $data
     * @return bool
     */
    protected function checkApplyTime($value, $rule, array $data = []): bool
    {
        $now = time();
        $start = strtotime($data['apply_start']);
        $end = strtotime($value);
        if ($start > $now && $start < $end) {
            return true;
        } else {
            return false;
        }
    }

    /**校验活动时间范围是否合理
     * @param $value
     * @param $rule
     * @param array $data
     * @return bool
     */
    protected function checkStartTime($value, $rule, array $data = []): bool
    {
        $now = time();
        $start = strtotime($data['start_time']);
        $end = strtotime($value);
        if ($start > $now && $start < $end) {
            return true;
        } else {
            return false;
        }
    }

    /**校验上午时间段起止时间
     * @param $value
     * @param $rule
     * @param array $data
     * @return bool
     */
    protected function checkAMPeriod($value, $rule, array $data = []): bool
    {
        if (!in_array(1, $data['period']) || !empty($value)) {
            return true;
        } else {
            return false;
        }
    }

    /**校验下午时间段起止时间
     * @param $value
     * @param $rule
     * @param array $data
     * @return bool
     */
    protected function checkPMPeriod($value, $rule, array $data = []): bool
    {
        if (!in_array(2, $data['period']) || !empty($value)) {
            return true;
        } else {
            return false;
        }
    }

    /**校验晚上时间段起止时间
     * @param $value
     * @param $rule
     * @param array $data
     * @return bool
     */
    protected function checkNNPeriod($value, $rule, array $data = []): bool
    {
        if (!in_array(3, $data['period']) || !empty($value)) {
            return true;
        } else {
            return false;
        }
    }
}
